﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class CentroCustoProduto : Form
    {
        #region Propriedades e Variáveis

        BLL.CentroCustoProdutoAtivo CentroCustoProdutoAtivo = new BLL.CentroCustoProdutoAtivo();

        List<BLL.ProdutoFamilia.Itens> FamiliaProdutosDisponiveis = new List<BLL.ProdutoFamilia.Itens>();
        List<BLL.UnidadeNegocio.Itens> UnidadeNegociosDisponiveis = new List<BLL.UnidadeNegocio.Itens>();

        List<BLL.ProdutoFamilia.Itens> FamiliaProdutosAtivos = null;
        List<BLL.UnidadeNegocio.Itens> UnidadeNegociosAtivos = null;

        //Lista para armazenar os produtos vindos do centro de custo
        List<BLL.CentroCustoProdutoAtivo.Lista> ListaCentroCustoProdutosAtivo;

        int IdCentroCusto;
        #endregion

        #region Construtor

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pIdCentroCusto"></param>
        public CentroCustoProduto(int pIdCentroCusto)
        {
            try
            {
                InitializeComponent();

                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                InicializaGrids();
                CarregaObjeto(pIdCentroCusto);
                CarregaListas();
                

                IdCentroCusto = pIdCentroCusto;
                if (ListaCentroCustoProdutosAtivo != null && ListaCentroCustoProdutosAtivo.Count() > 0)
                {
                    if (ListaCentroCustoProdutosAtivo.First().IndicaTodosProdutos == true)
                        rdbTodosProdutos.Checked = true;
                    else if (ListaCentroCustoProdutosAtivo.First().IndicaFamiliaProduto == true)
                        rdbFamiliaProduto.Checked = true;
                    else if (ListaCentroCustoProdutosAtivo.First().IndicaUnidadeNegocio == true)
                        rdbUnidadeNegocio.Checked = true;
                }
                else
                    rdbTodosProdutos.Checked = true;


            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public CentroCustoProduto()
        {
            InitializeComponent();
            throw new Exception("Informe o Centro de custo");
        }

        #endregion Construtor

        #region Eventos

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ValidarInterface();
                Salvar();
                MessageBox.Show("Produtos relacionados com sucesso.");
                this.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdbTodosProdutos_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbTodosProdutos.Checked == true)
                AtualizaInterface();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdbFamiliaProduto_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbFamiliaProduto.Checked == true)
                AtualizaInterface();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rdbUnidadeNegocio_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbUnidadeNegocio.Checked == true)
                AtualizaInterface();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            if (rdbFamiliaProduto.Checked == true)
            {
                foreach (DataGridViewRow item in dgvFamiliaDisponiveis.SelectedRows)
                {
                    if(FamiliaProdutosAtivos.Count() == 0)
                        FamiliaProdutosAtivos = new List<BLL.ProdutoFamilia.Itens>(){ new BLL.ProdutoFamilia.Itens(){ IdProdutoFamilia = FamiliaProdutosDisponiveis[item.Index].IdProdutoFamilia, NomeProdutoFamilia = FamiliaProdutosDisponiveis[item.Index].NomeProdutoFamilia}};
                    else
                        FamiliaProdutosAtivos.Add(FamiliaProdutosDisponiveis[item.Index]);

                    FamiliaProdutosDisponiveis.Remove(FamiliaProdutosDisponiveis[item.Index]);
                }
                AtualizaGridFamilia();
            }
            else if (rdbUnidadeNegocio.Checked == true)
            {
                foreach (DataGridViewRow item in dgvUnidadeDisponiveis.SelectedRows)
                {
                    if (UnidadeNegociosAtivos.Count() == 0)
                        UnidadeNegociosAtivos = new List<BLL.UnidadeNegocio.Itens>() { new BLL.UnidadeNegocio.Itens() { IdUnidadeNegocio = UnidadeNegociosDisponiveis[item.Index].IdUnidadeNegocio, NomeUnidadeNegocio = UnidadeNegociosDisponiveis[item.Index].NomeUnidadeNegocio } };
                    else
                        UnidadeNegociosAtivos.Add(UnidadeNegociosDisponiveis[item.Index]);

                    UnidadeNegociosDisponiveis.Remove(UnidadeNegociosDisponiveis[item.Index]);
                }
                AtualizaGridUnidadeNegocio();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRemover_Click(object sender, EventArgs e)
        {
            if (rdbFamiliaProduto.Checked == true)
            {
                foreach (DataGridViewRow item in dgvFamiliaAtivos.SelectedRows)
                {
                    if (FamiliaProdutosDisponiveis.Count() == 0)
                        FamiliaProdutosDisponiveis = new List<BLL.ProdutoFamilia.Itens>() { new BLL.ProdutoFamilia.Itens() { IdProdutoFamilia = FamiliaProdutosAtivos[item.Index].IdProdutoFamilia, NomeProdutoFamilia = FamiliaProdutosAtivos[item.Index].NomeProdutoFamilia } };
                    else
                        FamiliaProdutosDisponiveis.Add(FamiliaProdutosAtivos[item.Index]);
                    
                    FamiliaProdutosAtivos.Remove(FamiliaProdutosAtivos[item.Index]);
                }
                AtualizaGridFamilia();
            }
            else if (rdbUnidadeNegocio.Checked == true)
            {
                foreach (DataGridViewRow item in dgvUnidadeAtivos.SelectedRows)
                {
                    if (UnidadeNegociosDisponiveis.Count() == 0)
                        UnidadeNegociosDisponiveis = new List<BLL.UnidadeNegocio.Itens>() { new BLL.UnidadeNegocio.Itens() { IdUnidadeNegocio = UnidadeNegociosAtivos[item.Index].IdUnidadeNegocio, NomeUnidadeNegocio = UnidadeNegociosAtivos[item.Index].NomeUnidadeNegocio } };
                    else
                        UnidadeNegociosDisponiveis.Add(UnidadeNegociosAtivos[item.Index]);
                    
                    UnidadeNegociosAtivos.Remove(UnidadeNegociosAtivos[item.Index]);
                }
                AtualizaGridUnidadeNegocio();
            }
        }

        #endregion Eventos

        #region Métodos Privados
        
        /// <summary>
        /// 
        /// </summary>
        public void ValidarInterface()
        {
            if (rdbTodosProdutos.Checked == false && rdbFamiliaProduto.Checked == false && rdbUnidadeNegocio.Checked == false ) throw new Exception("Selecione uma opção de Produtos.");
            if (rdbFamiliaProduto.Checked == true && FamiliaProdutosAtivos.Count() == 0) throw new Exception("Selecione uma família de produtos.");
            if (rdbUnidadeNegocio.Checked == true && UnidadeNegociosAtivos.Count() == 0) throw new Exception("Selecione uma BU.");
        }

        /// <summary>
        /// 
        /// </summary>
        private void Salvar()
        {
            foreach (var item in ListaCentroCustoProdutosAtivo)
	        {
                CentroCustoProdutoAtivo.Delete(new List<BLL.CentroCustoProdutoAtivo.Lista>() { item});
	        }

            if (rdbTodosProdutos.Checked == true)
                ListaCentroCustoProdutosAtivo = new List<BLL.CentroCustoProdutoAtivo.Lista>() 
                    { 
                        new BLL.CentroCustoProdutoAtivo.Lista()
                        { IdCentroCusto = this.IdCentroCusto, IndicaTodosProdutos = true}
                    };
            else if (rdbFamiliaProduto.Checked == true)
                ListaCentroCustoProdutosAtivo = FamiliaProdutosAtivos
                    .Select(s => new BLL.CentroCustoProdutoAtivo.Lista { 
                        IdCentroCusto = this.IdCentroCusto, 
                        IndicaFamiliaProduto = true,
                        idProdutoFamilia = s.IdProdutoFamilia,
                        NomeProdutoFamilia = s.NomeProdutoFamilia
                    }).ToList();
            else if (rdbUnidadeNegocio.Checked == true)
                ListaCentroCustoProdutosAtivo = UnidadeNegociosAtivos
                    .Select(s => new BLL.CentroCustoProdutoAtivo.Lista
                    {
                        IdCentroCusto = this.IdCentroCusto,
                        IndicaUnidadeNegocio = true,
                        IdUnidadeNegocio = s.IdUnidadeNegocio,
                        NomeUnidadeNegocio = s.NomeUnidadeNegocio
                    }).ToList();
            
            foreach (var item in ListaCentroCustoProdutosAtivo)
            {
                CentroCustoProdutoAtivo.Add(new List<BLL.CentroCustoProdutoAtivo.Lista>() { item });
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private void AtualizaInterface()
        {
            dgvFamiliaAtivos.Visible = rdbFamiliaProduto.Checked == true ? true : false;
            dgvFamiliaDisponiveis.Visible = rdbFamiliaProduto.Checked == true ? true : false;

            dgvUnidadeAtivos.Visible = rdbUnidadeNegocio.Checked == true ? true : false;
            dgvUnidadeDisponiveis.Visible = rdbUnidadeNegocio.Checked == true ? true : false;

            btnAdicionar.Visible = rdbTodosProdutos.Checked == true ? false : true;
            btnRemover.Visible = rdbTodosProdutos.Checked == true ? false : true;

            if (rdbFamiliaProduto.Checked == true)
                AtualizaGridFamilia();
            else if (rdbUnidadeNegocio.Checked == true)
                AtualizaGridUnidadeNegocio();
        }

        /// <summary>
        /// 
        /// </summary>
        private void InicializaGrids()
        {
            dgvFamiliaDisponiveis.AutoGenerateColumns = false;
            dgvFamiliaDisponiveis.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvFamiliaDisponiveis.Columns.Add(new DataGridViewColumn() { Name = "Descricao", DataPropertyName = "NomeProdutoFamilia", HeaderText = "Família", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 10 });

            dgvFamiliaAtivos.AutoGenerateColumns = false;
            dgvFamiliaAtivos.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvFamiliaAtivos.Columns.Add(new DataGridViewColumn() { Name = "Descricao", DataPropertyName = "NomeProdutoFamilia", HeaderText = "Família", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 10 });

            dgvUnidadeDisponiveis.AutoGenerateColumns = false;
            dgvUnidadeDisponiveis.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvUnidadeDisponiveis.Columns.Add(new DataGridViewColumn() { Name = "Descricao", DataPropertyName = "NomeUnidadeNegocio", HeaderText = "BU", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 10 });

            dgvUnidadeAtivos.AutoGenerateColumns = false;
            dgvUnidadeAtivos.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvUnidadeAtivos.Columns.Add(new DataGridViewColumn() { Name = "Descricao", DataPropertyName = "NomeUnidadeNegocio", HeaderText = "BU", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 10 });

        }

        /// <summary>
        /// 
        /// </summary>
        private void AtualizaGridUnidadeNegocio()
        {
            dgvUnidadeDisponiveis.DataSource = null;
            dgvUnidadeAtivos.DataSource = null;

            dgvUnidadeDisponiveis.DataSource = UnidadeNegociosDisponiveis;
            dgvUnidadeAtivos.DataSource = UnidadeNegociosAtivos;

            dgvUnidadeDisponiveis.ClearSelection();
            dgvUnidadeAtivos.ClearSelection();
        }

        /// <summary>
        /// 
        /// </summary>
        private void AtualizaGridFamilia()
        {
            dgvFamiliaDisponiveis.DataSource = null;
            dgvFamiliaAtivos.DataSource = null;

            dgvFamiliaDisponiveis.DataSource = FamiliaProdutosDisponiveis;
            dgvFamiliaAtivos.DataSource = FamiliaProdutosAtivos;

            dgvFamiliaDisponiveis.ClearSelection();
            dgvFamiliaAtivos.ClearSelection();
        }

        /// <summary>
        /// 
        /// </summary>
        private void CarregaObjeto(int pCentroCusto)
        {
            ListaCentroCustoProdutosAtivo = CentroCustoProdutoAtivo.GetLista(new BLL.CentroCustoProdutoAtivo.Lista() { IdCentroCusto = pCentroCusto });
        }

        /// <summary>
        /// 
        /// </summary>
        private void CarregaListas()
        {
            BLL.ProdutoFamilia familia = new BLL.ProdutoFamilia();
            BLL.UnidadeNegocio Unidade = new BLL.UnidadeNegocio();

            FamiliaProdutosAtivos = ListaCentroCustoProdutosAtivo.Where(w => w.IndicaFamiliaProduto == true).Select(s => new BLL.ProdutoFamilia.Itens() { IdProdutoFamilia = (int)s.idProdutoFamilia, NomeProdutoFamilia = s.NomeProdutoFamilia }).ToList();
            UnidadeNegociosAtivos = ListaCentroCustoProdutosAtivo.Where(w => w.IndicaUnidadeNegocio == true).Select(s => new BLL.UnidadeNegocio.Itens() { IdUnidadeNegocio = (int)s.IdUnidadeNegocio, NomeUnidadeNegocio = s.NomeUnidadeNegocio }).ToList();

            FamiliaProdutosDisponiveis = (from f in familia.GetItens()
                                          join a in FamiliaProdutosAtivos
                                          on f.IdProdutoFamilia equals a.IdProdutoFamilia
                                          into fam
                                          from a in fam.DefaultIfEmpty()
                                          where a == null
                                          select new BLL.ProdutoFamilia.Itens
                                          {
                                              IdProdutoFamilia = f.IdProdutoFamilia,
                                              NomeProdutoFamilia = f.NomeProdutoFamilia
                                          }).ToList();

            UnidadeNegociosDisponiveis = (from u in Unidade.GetItens()
                                          join a in UnidadeNegociosAtivos
                                          on u.IdUnidadeNegocio equals a.IdUnidadeNegocio
                                          into fam
                                          from a in fam.DefaultIfEmpty()
                                          where a == null
                                          select new BLL.UnidadeNegocio.Itens
                                          {
                                              IdUnidadeNegocio = u.IdUnidadeNegocio,
                                              NomeUnidadeNegocio = u.NomeUnidadeNegocio
                                          }).ToList();
        }

        #endregion Métodos Privados

    }
}
